package com.wemew.securityapi.config.security.config;

import com.wemew.common.enums.password.PassWordEnum;
import com.wemew.common.redis.UserRedis;
import com.wemew.common.utils.DateUtils;
import io.jsonwebtoken.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.Date;

/**
 * 作者 CG
 * 时间 2021/1/13 17:00
 * 注释 token生成管理类
 */
@Component
public class TokenManager {
    //编码秘钥
    private String tokenSignKey = "bxOqQKp9z951J7ZE";
    @Autowired
    private UserRedis userRedis;

    //1 使用jwt根据用户名生成token
    public String createToken(String userinfo, String code) {
        String token = Jwts.builder().setSubject(userinfo).setIssuer(code)
                .setExpiration(DateUtils.toDayDate(PassWordEnum.TOKEN过期.getParam()))
                .signWith(SignatureAlgorithm.HS512, tokenSignKey).compressWith(CompressionCodecs.GZIP).compact();
        return token;
    }

    //2 根据token字符串得到用户信息
    public String getUserInfoFromToken(String token) {
        String userinfo = getJwt(token).getBody().getSubject();
        return userinfo;
    }
    public String getUserInfoFromToken(Jws<Claims> jws) {
        String userinfo = jws.getBody().getSubject();
        return userinfo;
    }

    //3 删除token
    public void removeToken(String token) {
        String userInfoFromToken = getUserInfoFromToken(token);
        userRedis.delTokenCode(userInfoFromToken);
        userRedis.delPermissions(userInfoFromToken);
    }

    /**
     * 作者 CG
     * 时间 2021/1/14 14:58
     * 注释 获取jwt过期时间
     */
    public Date getExpiration(String token) {
        Date expiration = getJwt(token).getBody().getExpiration();
        return expiration;
    }

    public Date getExpiration(Jws<Claims> jws) {
        Date expiration = jws.getBody().getExpiration();
        return expiration;
    }

    /**
     * 作者 CG
     * 时间 2021/1/14 15:00
     * 注释 获取jwt
     */
    public Jws<Claims> getJwt(String token) {
        Jws<Claims> claimsJws = Jwts.parser().setSigningKey(tokenSignKey).parseClaimsJws(token);
        return claimsJws;
    }

    /**
     * 作者 CG
     * 时间 2021/1/14 15:02
     * 注释 检查token是否过期
     */
    public Boolean ifExpiration(String token) {
        Date expiration = getExpiration(token);
        return expiration.getTime() > System.currentTimeMillis() ? false : true;
    }

    public Boolean ifExpiration(Jws<Claims> jws) {
        Date expiration = getExpiration(jws);
        return expiration.getTime() > System.currentTimeMillis() ? false : true;
    }

    /**
     * 作者 CG
     * 时间 2021/1/14 15:14
     * 注释 获取code
     */
    public String getCode(String token) {
        String code = getJwt(token).getBody().getIssuer();
        return code;
    }

    public String getCode(Jws<Claims> jws) {
        String code = jws.getBody().getIssuer();
        return code;
    }
}
